import re
import numpy as np


class ReMatchFunc(object):

    @classmethod
    def other_countryside(cls, split_list):
        '''
        装帧
        :param split_list:
        :return:
        '''

        match_list = []

        # 外国国名【完全匹配】
        standard_list1 = '安道尔，阿联酋，阿富汗，安提瓜和巴布达，安圭拉，阿尔巴尼亚，亚美尼亚，荷属安的列斯群岛，安哥拉，阿根廷，美属' \
                         '萨摩亚，奥地利，澳大利亚，阿鲁巴群岛，阿塞拜疆，波斯尼亚，巴巴多斯，孟加拉，比利时，布基纳法索，保加利亚，巴林' \
                         '，布隆迪，贝宁，圣巴瑟米，百慕大，文莱，玻利维亚，荷兰加勒比区，巴西，巴哈马，不丹，布韦岛，博茨瓦纳，白俄罗斯' \
                         '，伯利兹，加拿大，科科斯群岛，刚果民主共和国，中非共和国，刚果，瑞士，科特迪瓦，库克群岛，智利，喀麦隆，哥伦比' \
                         '亚，哥斯达黎加，古巴，佛得角，库拉索，圣诞岛，塞浦路斯，捷克，德国，吉布提，丹麦，多米尼克，多米尼加，阿尔及利' \
                         '亚，厄瓜多尔，爱沙尼亚，埃及，西撒哈拉，厄立特里亚，西班牙，埃塞俄比亚，欧盟，芬兰，斐济，福克兰群岛，密克罗尼' \
                         '西亚联邦，法罗群岛，法国，加蓬，英国，格林纳达，格鲁吉亚，法属圭亚那，格恩西岛，加纳，直布罗陀，格陵兰，冈比亚' \
                         '，几内亚，瓜德罗普，赤道几内亚，希腊，南乔治亚岛，危地马拉，关岛，几内亚比绍，圭亚那，中国香港，赫德岛和麦克唐' \
                         '纳群岛，洪都拉斯，克罗地亚，海地，匈牙利，印度尼西亚，爱尔兰，以色列，印度，英属印度洋领地，伊拉克，伊朗，冰岛' \
                         '，意大利，牙买加，约旦，日本，肯尼亚，吉尔吉斯斯坦，柬埔寨，基里巴斯，科摩罗，圣基茨和尼维斯，朝鲜，韩国，科索' \
                         '沃，科威特，开曼群岛，哈萨克斯坦，老挝，黎巴嫩，圣卢西亚，列支敦士登，斯里兰卡，利比里亚，莱索托，立陶宛，卢森' \
                         '堡，拉脱维亚，利比亚，摩洛哥，摩纳哥，摩尔多瓦，黑山，马达加斯加，马绍尔群岛，马其顿，马里，缅甸，蒙古，中国澳' \
                         '门，北马里亚纳群岛，马提尼克，毛里塔尼亚，蒙特塞拉特，马耳他，毛里求斯，马尔代夫，马拉维，墨西哥，马来西亚，莫' \
                         '桑比克，纳米比亚，新喀里多尼亚，尼日尔，诺福克岛，尼日利亚，尼加拉瓜，荷兰，挪威，尼泊尔，瑙鲁，纽埃，新西兰，' \
                         '阿曼，巴拿马，秘鲁，法属波利尼西亚，巴布亚新几内亚，菲律宾，巴基斯坦，波兰，圣皮埃尔和密克隆，皮特凯恩，波多黎' \
                         '各，加沙地带，葡萄牙，帕劳，巴拉圭，卡塔尔，留尼旺群岛，罗马尼亚，塞尔维亚，俄罗斯，卢旺达，沙特阿拉伯，所罗门' \
                         '群岛，塞舌尔，苏丹，瑞典，新加坡，圣赫勒拿，阿森松岛和特里斯坦达库尼亚，斯洛文尼亚，斯瓦尔巴特群岛，斯洛伐克，' \
                         '塞拉利昂，圣马力诺，塞内加尔，索马里，苏里南，南苏丹，圣多美和普林西比，萨尔瓦多，荷属圣马丁，叙利亚，斯威士兰' \
                         '，特克斯和凯科斯群岛，乍得，多哥，泰国，塔吉克斯坦，托克劳群岛，东帝汶，土库曼斯坦，突尼斯，汤加，土耳其，特里' \
                         '尼达和多巴哥，图瓦卢，中国台湾，坦桑尼亚，乌克兰，乌干达，美国本土外小岛屿，美国，乌拉圭，乌兹别克斯坦，梵蒂冈' \
                         '，圣文森特和格林纳丁斯，委内瑞拉，英属维尔京群岛，维京群岛，越南，瓦努阿图，瓦利斯群岛和富图纳群岛，萨摩亚，也' \
                         '门，马约特岛，南非，赞比亚，津巴布韦，法，挪，马尔维纳斯群岛，日，美，比，英，意，西，加，荷，韩，俄，德，丹，' \
                         '奥，苏，印，苏联，前苏联，匈'.split('，')

        for txt in split_list:
            if txt in standard_list1:
                match_list.append(txt)

        return match_list

    @classmethod
    def cn_countryside(cls, split_list):

        match_list = []

        # 中国朝代【完全匹配】
        standard_list2 = '夏朝，商朝，周朝，西周，东周，春秋，战国，秦朝，西楚，汉朝，西汉，新朝，玄汉，东汉，三国，曹魏，蜀汉，东吴，晋' \
                         '朝，西晋，东晋，五胡十六国，南北朝，南朝，宋，齐，梁，陈，北朝，北魏，东魏，西魏，北齐，北周，隋朝，唐朝，后梁' \
                         '，后唐，后晋，后汉，后周，南吴，前蜀，吴越，楚，闽，南汉，荆南，后蜀，南唐，北汉，宋朝，北宋，南宋，辽，西夏，' \
                         '金，元朝，明朝，清朝，夏，商，周，秦，汉，新，晋，南北，南，北，隋，唐，元，明，清，中国，中，台湾，台，澳门，' \
                         '澳，香港，港，中国大陆，中国香港，中国台湾'.split('，')
        for txt in split_list:
            if txt in standard_list2:
                match_list.append(txt)

        return match_list

    @classmethod
    def other_name(cls, split_list):
        '''
        作者姓名
        :return:
        '''
        match_list = []

        # 外国姓名片段【部分匹配】
        standard_list1 = '赛茜莉雅，克洛迪雅，荻思梦娜，黛妮，克洛哀，菲莉茜雅，安，丝诺，爱丝，赛莉娜，爱玛黎丝，茜丝莉，赛西尔，' \
                         '安洁莉娜，莎珂拉，卡丽妲，艾莉娜，爱莱塔，卡西欧，优利卡，瑰拉，英帝拉，义哲法，露易斯，克斯玛，帝傲霓，' \
                         '蜜雪儿，米迦列拉，穆利尔，莉丽丝，伊旭塔，伊丝塔，洛勒莱，迪丽拉，魅兰莎，萨德，金铂利，姬魅，婕丽，马欣娜，' \
                         '梅恩，明娜，玛米，墨菲，米内塔，马里玛丽，玛丽，马尼亚，梅尔，玛拉，马默，莫安娜，米娜，明蒂，莫欧拉，玛纳，' \
                         '马弗尔，明达，蜜拉，孟菲斯，米拉伊，莫奈，穆恩，曼妞拉，马宇米，马扬，麦娜，很多人，莫妮卡，蒙大拿，莫伊娜，' \
                         '马维拉，穆拉，米雷娅，米妮，米拉，马佩萨，玛贝拉，曼蒂，梅拉，莫拉，梅里，明迪，汉斯，沃尔夫冈，约瑟夫，马丁，' \
                         '米歇尔，米勒，巴赫，库恩，亚历山大，安东，费利克斯，凯，爱玛，贝拉，安娜，丽莎，尼那，伊娃，多丽斯，伊丽莎白，' \
                         '芭芭拉，汉娜，露西，阿列克谢，瓦西里，维克托，格里戈里，季米特里，伊戈尔，列夫，谢尔盖，娜塔莎，达莎，叶娃，' \
                         '叶卡捷琳娜，卡佳，伊丽娜，柳德米拉，娜塔莉娅，阿方索，菲利普，阿莉西亚，娜娜，阿隆索，何塞，荷西，贝莲，罗莎，' \
                         '安东尼奥，胡安，卡门，索尼娅，卡洛斯，胡里奥，西西莉亚，特雷莎，丹尼尔，路易斯，迪亚哥，马诺罗，迭戈，佐藤，' \
                         '铃木，高桥，田中，渡边，伊藤，山本，中村，小林，斋藤，加藤，吉田，山田，佐佐木，山口，松本，井上，木村，林，' \
                         '清水，山崎，中岛，池田，阿部，桥本，山下，森，石川，前田，小川，藤田，冈田，后藤，长谷川，石井，村上，近藤，' \
                         '坂本，远藤，青木，藤井，西村，福田，太田，三浦，藤原，冈本，松田，中川，中野，原田，小野，田村，竹内，金子，' \
                         '和田，中山，石田，上田，森田，小岛，柴田，原，宫崎，酒井，工藤，藤峰，横山，宫本，内田，高木，安藤，岛田，谷' \
                         '口，大野，高田，丸山，今井，河野，藤本，村田，武田，上野，杉山，增田，小山，大冢，平野，菅原，久保，松井，千' \
                         '叶，岩崎，樱井，木下，野口，松尾，菊地，野村，新井，渡部，佐野，杉本，大西，古川，滨田，市川，小松，高野，水' \
                         '野，吉川，山内，西田，西川，菊池，北村，五十岚，福岛，安田，中田，平田，川口，川崎，饭田，本田，泽田，久保田' \
                         '，吉村，中西，岩田，服部，辻，关，富田，川上，樋口，永井，松冈，山中，田口，森本，矢野，秋山，大岛，小泽，广' \
                         '濑，土屋，石原，松下，马场，大桥，松浦，吉冈，荒木，小池，久保，浅野，熊谷，野田，川村，田边，星野，大谷，' \
                         '，尾崎，永田，松村，望月，内藤，菅野，西山，堀，岩本，平井，片山，川岛，本间，冈崎，横田，早川，荒井，镰田，' \
                         '小田，成田，宫田，大石，石桥，筱原，高山，须藤，萩原，大泽，小西，栗原，松原，伊东，三宅，大森，福井，南，奥' \
                         '村，松永，片冈，桑原，内山，关口，古贺，奥田，冈，北川，八木，上原，吉野，白石，今村，中泽，田岛，涩谷，小泉' \
                         '，上村，中尾，平山，青山，牧野，冈村，寺田，坂口，儿玉，大山，河合，多田，竹田，宫下，小仓，小野寺，小笠原，足' \
                         '立，村山，天野，坂井，杉浦，西，坂田，小原，丰田，角田，武藤，河村，根本，关根，水谷，中井，森下，神田，冢本，' \
                         '佐久间，植田，饭冢，安部，前川，山根，浅井，白井，宫川，冈部，大川，长田，堀内，松崎，饭岛，榎本，稻垣，若林' \
                         '，森山，金泽，江口，神谷，中谷，畠山，谷，细川，及川，安达，今野，三上，西尾，田代，石冢，岸本，津田，荒川，中' \
                         '原，长尾，户田，本多，高岛，森川，泷泽，土井，三好，金井，松山，米田，冈野，稻叶，村松，甲斐，西冈，佐伯，岩' \
                         '井，星，金田，黑木，野崎，藤泽，堤，落合，泉，堀田，广田，西野，町田，吉泽，古田，宫泽，德永，新田，长岛，山岸' \
                         '，富永，柳泽，黑川，山川，川田，松岛，杉田，奥山，土田，三木，村井，黑泽，笠原，须田，梅田，大竹，野中，堀江，' \
                         '川端，大村，日高，梶原，岸，西本，井口，大木，长泽，向井，大场，竹中，藤川，安井，榊原，川原，吉本，大内，深泽' \
                         '，竹下，西泽，吉原，藤冈，庄司，福本，冢田，宫内，小谷，绪方，谷川，下田，竹本，相泽，藤村，奥野，宇野，洼田，' \
                         '北野，栗田，石黑，野泽，龟井，平川，长野，宫原，山村，藤野，茂木，岛崎，川本，下村，丹羽，青柳，竹村，古谷，三轮' \
                         '，出口，高井，荻野，大城，田原，高濑，小森，稻田，宫城，筒井，福冈，矢岛，大原，福永，林田，横井，大平，金城，筱' \
                         '崎，长冈，沟口，平松，山冈，浅田，越智，北原，永野，武井，鹤田，柳田，北岛，入江，大田，滨口，汤浅，相马，园田' \
                         '，高松，二宫，石山，堀川，手冢，川野，沼田，石崎，比嘉，臼井，宫岛，平冈，滨崎，池上，花田，谷本，濑户，西原，' \
                         '小出，筱田，杉原，志村，根岸，田畑，滨野，笠井，寺岛，松泽，三岛，大槻，岛村，仓田，福原，片桐，日野，小坂，菅' \
                         '，堀口，加纳，河原，新谷，千田，松野，德田，田上，吉井，森冈，柏木，村濑，内海，白川，畑中，秋元，大崎，中本，' \
                         '小柳，岩濑，原口，秋田，三谷，木原，岛，大井，川畑，福山，米山，米泽，植木，岩下，难波，古泽，今泉，三井，辻本' \
                         '，芳贺，坪井，井手，吉永，河内，畑，矶部，长井，荻原，大坪，盐田，真锅，岸田，皆川，细田，大友，细谷，植村，佐' \
                         '竹，河田，古屋，相原，若松，三村，远山，村冈，桥口，松川，平林，草野，川濑，栗山，橘，有马，井出，保坂，早坂，' \
                         '濑川，泷本，志贺，高冈，奈良，半田，龟山，高村，堀井，清野，玉井，神山，朝仓，富樫，水口，河本，进藤，富冈，中' \
                         '里，立石，岩渊，葛西，丰岛，水上，平泽，藤森，柳，川合，北泽，龟田，织田，武内，有田，三原，尾形，高见，狩野，宫' \
                         '地，大津，寺本，藤崎，植松，市村，坂下，平，大江，板垣，毛利，西岛，江藤，曾根，那须，北山，高柳，下山，高原，' \
                         '大沼，三桥，立花，浅见，久野，松木，木内，滨本，野上，田渊，门胁，手岛，泷口，坂上，土居，中根，平尾，三泽，牧' \
                         '，岩佐，田崎，深谷，石丸，阪本，市原，小宫，长谷，今田，守屋，前原，高尾，内野，柴崎，岩永，大仓，富泽，川井，' \
                         '高崎，关谷，金山，长濑，正木，饭野，矢部，外山，和泉，山野，金谷，秦，冢原，海野，鸟居，西谷，田川，成濑，木田，' \
                         '石垣，大泷，石本，小寺，坂元，门田，末永，长谷部，富山，井田，上山，金森，小畑，菅谷，永岛，奥，乾，宫胁，江崎' \
                         '，赤松，相川，梅泽，江川，板仓，野本，三田，永山，岛津，山上，藤木，杉村，小杉，小室，肉户，香川，泽井，水岛，' \
                         '黑岩，梅原，小关，松元，平冢，川边，喜多，诹访，今西，井川，生田，森谷，并木，宇佐美，秋叶，盐谷，水田，佐川，' \
                         '下川，细井，石渡，浦田，布施，金丸，真田，森胁，染谷，宫野，北田，风间，新垣，梅本，山城，中林，大矢，小椋，西' \
                         '口，玉城，土桥，高梨，细野，大庭，船桥，山元，滨，都筑，长崎，木本，仲田，阿久津，小幡，杉野，寺泽，麻生，山形' \
                         '，堀越，依田，小野田，梅津，羽田，木户，野原，赤木，浅川，椎名，岩间，日下，寺尾，仲村，宇都宫，矢田，矢口，大' \
                         '畑，大和田，波多野，大熊，前岛，儿岛，目黑，立川，菅沼，大贯，高仓，深田，泷川，池内，石泽，柳原，岩城，海老原，' \
                         '仓持，神崎，雨宫，影山，冈岛，神野，栗林，桥爪，石坂，上杉，结城，青野，川西，小沼，白鸟，濑尾，赤坂，板桥，小' \
                         '玉，首藤，清田，合田，玉置，丹野，尾上，角，泷，须贺，竹原，国分，横尾，井原，坂野，久米，森口，芦田，宫坂，泽' \
                         '，藤岛，柏原，三枝，楠本，妹尾，胁田，池本，明石，西胁，大下，北，大和，樱田，胜又，大林，川越，本村，小久保，' \
                         '小堀，本桥，野岛，有贺，田端，志田，横川，浦野，柳川，谷村，春日，今，坂东，飞田，江原，梅村，内村，会田，熊泽' \
                         '，冈山，桑田，楠，角谷，日比野，砂川，益田，泽村，安斋，花冈，笹川，中冢，胜田，吉崎，井泽，岛袋，森永，曾我，' \
                         '浅沼，白木，平良，小栗，石仓，田泽，前野，小菅，高畑，井本，岛本，玉木，高谷，冲田，仓本，长滨，冲，鹤冈，高泽，' \
                         '大浦，宇田川，柴山，本山，黑崎，城户，盐见，岩谷，北条，畠中，池谷，大高，广川，熊田，重松，阪口，野吕，八田，' \
                         '户冢，寺冈，菅井，末吉，井村，鹿岛，田尻，石野，川添，盐泽，田所，古山，伊泽，南部，岩泽，矢泽，神户，丸田，福' \
                         '地，笹原，恩田，平贺，米仓，森岛，增井，村木，福泽，中，五味，峰，日下部，菊田，森井，凑，秋本，矶野，寺西，若' \
                         '山，安永，重田，小峰，新村，上条，长友，小口，今川，泷田，猪股，深井，百濑，绀野，熊仓，鬼头，中冈，唐泽，玉田' \
                         '，氏家，小高，有村，岩村，小平，赤羽，境，寺井，河西，土谷，神原，西浦，照井，西井，牧田，宫里，相田，松谷，小' \
                         '田岛，藤山，福斯，品川，村中，对马，八乙女'.replace('，，', '，').split('，')
        for txt2 in split_list:
            for txt1 in standard_list1:
                if txt1 in txt2:
                    if txt2 not in match_list:
                        match_list.append(txt2)

        return match_list

    @classmethod
    def cn_name(cls, split_list):

        match_list = []

        # 中国姓氏【开头匹配】
        standard_list2 = '赵，钱，孙，李，周，吴，郑，王，冯，陈，褚，卫，蒋，沈，韩，杨，朱，秦，尤，许，何，吕，施，张，孔，曹，严，华，' \
                        '金，魏，陶，姜，戚，谢，邹，喻，柏，水，窦，章，云，苏，潘，葛，奚，范，彭，郎，鲁，韦，昌，马，苗，凤，花，方，' \
                        '俞，任，袁，柳，酆，鲍，史，唐，费，廉，岑，薛，雷，贺，倪，汤，滕，殷，罗，毕，郝，邬，安，常，乐，于，时，傅，' \
                        '皮，卞，齐，康，伍，余，元，卜，顾，孟，平，黄，和，穆，萧，尹，姚，邵，湛，汪，祁，毛，禹，狄，米，贝，明，臧，' \
                        '计，伏，成，戴，谈，宋，茅，庞，熊，纪，舒，屈，项，祝，董，梁，杜，阮，蓝，闵，席，季，麻，强，贾，路，娄，危，' \
                        '江，童，颜，郭，梅，盛，林，刁，钟，徐，邱，骆，高，夏，蔡，田，樊，胡，凌，霍，虞，万，支，柯，昝，管，卢，莫，' \
                        '经，房，裘，缪，干，解，应，宗，丁，宣，贲，邓，郁，单，杭，洪，包，诸，左，石，崔，吉，钮，龚，程，嵇，邢，滑，' \
                        '裴，陆，荣，翁，荀，羊，於，惠，甄，麴，家，封，芮，羿，储，靳，汲，邴，糜，松，井，段，富，巫，乌，焦，巴，弓，' \
                        '牧，隗，山，谷，车，侯，宓，蓬，全，郗，班，仰，秋，仲，伊，宫，宁，仇，栾，暴，甘，钭，厉，戎，祖，武，符，刘，' \
                        '景，詹，束，龙，叶，幸，司，韶，郜，黎，蓟，薄，印，宿，白，怀，蒲，邰，从，鄂，索，咸，籍，赖，卓，蔺，屠，蒙，' \
                        '池，乔，阴，郁，胥，能，苍，双，闻，莘，党，翟，谭，贡，劳，逄，姬，申，扶，堵，冉，宰，郦，雍，舄，璩，桑，桂，' \
                        '濮，牛，寿，通，边，扈，燕，冀，郏，浦，尚，农，温，别，庄，晏，柴，瞿，阎，充，慕，连，茹，习，宦，艾，鱼，容，' \
                        '向，古，易，慎，戈，廖，庾，终，暨，居，衡，步，都，耿，满，弘，匡，国，文，寇，广，禄，阙，东，殴，殳，沃，利，' \ 
                        '蔚，越，夔，隆，师，巩，厍，聂，晁，勾，敖，融，冷，訾，辛，阚，那，简，饶，空，曾，毋，沙，乜，养，鞠，须，丰，' \
                        '巢，关，蒯，相，查，後，荆，红，游，竺，权，逯，盖，益，桓，公，万俟，司马，上官，欧阳，夏侯，诸葛，闻人，东方，' \
                        '赫连，皇甫，尉迟，公羊，澹台，公冶，宗政，濮阳，淳于，单于，太叔，申屠，公孙，仲孙，轩辕，令狐，钟离，宇文，长孙，' \
                        '慕容，鲜于，闾丘，司徒，司空，亓官，司寇，仉，督，子车，颛孙，端木，巫马，公西，漆雕，乐正，壤驷，公良，拓跋，夹谷，' \
                        '宰父，谷梁，晋，楚，闫，法，汝，鄢，涂，钦，段干，百里，东郭，南门，呼延，归，海，羊舌，微生，岳，帅，缑，亢，况，' \
                        '后，有，琴，梁丘，左丘，东门，西门，商，牟，佘，佴，伯，赏，南宫，墨，哈，谯，笪，年，爱，阳，佟，第五，言，福'.split('，')

        # split_list = [split for split in split_list if split not in match_list]

        for txt2 in split_list:
            for txt1 in standard_list2:
                if txt2.startswith(txt1):
                    if len(txt2) > len(txt1):
                        if txt2 not in match_list:
                            match_list.append(txt2)

        return match_list

    @classmethod
    def alias(cls, split_list):
        '''
        别名
        :return:
        '''

        match_list = []
        pattern = r'[A-Z|a-z]*'

        for txt in split_list:
            s = re.fullmatch(pattern, txt)
            if s:
                if txt not in match_list:
                    match_list.append(txt)

        return match_list

    @classmethod
    def zlfs(cls, split_list):
        match_list = []
        # 著录方式【完全匹配】
        standard_list = '译，编绘，改编，译者，编著，绘著，著，监制，编译，编，主编，参编，副主编，编文，著绘，原著，著作，编写，总主编' \
                        '，编者，主编译，执行主编，原创，出品，绘画，绘图，校注，责编，撰稿，撰，编撰，撰作，组编，译注，选编，译作，注' \
                        '译作，主编著，整理，整理作，口述，点评，丛书主编，文，图，绘，改写，著文，作，编作，主编作，摄影，点校，审校，' \
                        '插图，译著，主审，副主审，丛书总主编，翻译，改编著，释析，作者，绘制，书者，插图作者，注释，合著者，改写作，组编' \
                        '作，编译作，编注，副主编作，评注，注，组织编写，分册主编，辑'.split('，')

        # split_list = [split for split in split_list if split not in match_list]

        for txt2 in split_list:
            for txt1 in standard_list:
                if txt1 == txt2:
                    match_list.append(txt2)

        return match_list


def str_plus(str1, str2):
    '''
    将两个可能为None的字符中间加个分号组成一个字符串
    :param str1:
    :param str2:
    :return:
    '''
    if not isNaNo(str1) and not isNaNo(str2):
        return str1 + ';' + str2
    elif not isNaNo(str1) and isNaNo(str2):
        return str1
    elif isNaNo(str1) and not isNaNo(str2):
        return  str2
    return None

def isNaNo(sth):
    if not sth:
        return True
    if isinstance(sth, float):
        if np.isnan(sth):
            return True
    return False


if __name__ == '__main__':
    name_list = ReMatchFunc.name(['美', '詹姆斯·弗农'])
    print(name_list)
